package com.climb.spingcloud.generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

public class MpGenerator {
	public void generator(String projectPath, String projectName, String author, String url, String username, String password, String[] table_names, String[] tablePrefix, boolean hasSuperEntity, String[] superEntityColumns, String packageName, String moduleName) {
		// 1. 创建代码生成器
		AutoGenerator mpg = new AutoGenerator();

		// 2. 全局配置
		GlobalConfig gc = new GlobalConfig();
		gc.setOutputDir(projectPath + projectName + "/src/main/java");
		gc.setAuthor(author);
		gc.setFileOverride(true);
		gc.setOpen(false);
		gc.setBaseResultMap(true);
		gc.setBaseColumnList(true);
		gc.setIdType(IdType.ASSIGN_ID);
		gc.setServiceName("%sService");
		gc.setServiceImplName("%sServiceImpl");
		gc.setSwagger2(false);
		mpg.setGlobalConfig(gc);

		// 3. 数据库配置
		DataSourceConfig dsc = new DataSourceConfig();
		dsc.setDriverName("com.mysql.cj.jdbc.Driver");
		dsc.setUrl(url);
		dsc.setUsername(username);
		dsc.setPassword(password);
		dsc.setDbType(DbType.MYSQL);
		// 设置mysql中的字段类型和java中属性类型的对应关系
		dsc.setTypeConvert(new MySqlTypeConvertCustom());
		mpg.setDataSource(dsc);

		// 4. 策略配置
		StrategyConfig strategy = new StrategyConfig();
		// 设置表名
		strategy.setInclude(table_names);
		// 表名前缀，映射到实体名称去掉
		strategy.setTablePrefix(tablePrefix);
		strategy.setNaming(NamingStrategy.underline_to_camel);
		strategy.setColumnNaming(NamingStrategy.underline_to_camel);
		// 实体类使用lombok注解
		strategy.setEntityLombokModel(true);

		if(hasSuperEntity) {
			strategy.setSuperEntityClass("com.climb.spingcloud.base.BaseEntity");
			// 写于父类中的公共字段
			strategy.setSuperEntityColumns(superEntityColumns);
		}
		// 生成REST控制器
		strategy.setRestControllerStyle(true);
		//url中驼峰转连字符
		strategy.setControllerMappingHyphenStyle(true);

		// 逻辑删除字段名
		strategy.setLogicDeleteFieldName("is_deleted");
		// Boolean字段是否移除is前缀
		strategy.setEntityBooleanColumnRemoveIsPrefix(true);

		mpg.setStrategy(strategy);

		// 5. 包配置
		PackageConfig pc = new PackageConfig();
		pc.setParent(packageName);
		pc.setModuleName(moduleName);
		pc.setEntity("entity");
		pc.setMapper("mapper");
		pc.setXml("mapper");
		mpg.setPackageInfo(pc);

		mpg.execute();
	}
}

/*
MyBatis-Plus 3.3.1中自动生成代码tinyint(1)无法自动转换为Boolean的解决办法。
1.在测试类中新建一个类MySqlTypeConvertCustom，继承MySqlTypeConvert并实现ITypeConvert后覆盖processTypeConvert方法。
2.在generator中使用自己创建的类的对象。
 */
class MySqlTypeConvertCustom extends MySqlTypeConvert implements ITypeConvert {
	@Override
	public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
		String t = fieldType.toLowerCase();
		if (t.contains("tinyint")) {
			return DbColumnType.BOOLEAN;
		}
		return super.processTypeConvert(globalConfig, fieldType);
	}
}